from rest_framework import serializers
from django_redis import get_redis_connection
from oauth.models import OAuthQQUser
from oauth.utils import decode_sign_openid
from users.models import User



class OAuthQQUserSerializer(serializers.Serializer):
    password = serializers.CharField(min_length=8,max_length=20,label="密码")
    mobile = serializers.RegexField(regex=r'^1[3-9]\d{9}$',label="手机号")
    sms_code = serializers.CharField(min_length=6,max_length=6,label="短信验证码")
    access_token = serializers.CharField(label="openid")

    def validate(self, attrs):
        #这个attrs是哪里来的？？有什么语义？
        # 这个东西实际上是传过来的data    但是因为语义化的问题就这么写了
        #校验的意思　应该是一种序列化器的固定方法
        openid = decode_sign_openid(attrs["access_token"])
        if not openid:
            raise serializers.ValidationError("openid错误")


        mobile = attrs["mobile"]
        sms_code = attrs["sms_code"]
        redis_conn = get_redis_connection("code")
        #通过redis获取了里面的code
        redis_sms_code = redis_conn.get("sms_code_%s"%mobile)
        #在code里面获取mobile的对应的sms
        print(redis_sms_code)
        if not redis_sms_code:
            raise serializers.ValidationError("短信验证码过期")

        if sms_code!= redis_sms_code.decode():
            raise serializers.ValidationError("短信验证码错误")
        user=None
        try:
            user=User.objects.get(mobile=mobile)
        except User.DoesNotExist:
            pass
        else:
            #这里用else对么？有这种语法结构么？？？下面的那段是什么鬼？
            # 有的　　就是当ｔｒｙ执行好了之后会制动执行的　　　然后如果有ｆｉｎａｌｙ的话就会继续执行
            if not user.check_password(attrs["password"]):
                raise serializers.ValidationError("密码错误")

        attrs["openid"] = openid
        attrs["user"] = user
        #这样放东西进去　　user不是一个对象么？
        # 是的　　就是为了后面的方法做铺垫
        return attrs

    def create(self, validated_data):
        """
        :param validated_data:就是上面校验之后的数据
        :return:
        """
        # 1,获取数据
        openid = validated_data["openid"]
        user = validated_data["user"]

        # 2,判断是否存在user
        if not user:
            user = User.objects.create_user(
                username=validated_data["mobile"],
                password=validated_data["password"],
                mobile=validated_data["mobile"]
            )

        # 3,创建OAuthQQUser对象,绑定美多用户
        OAuthQQUser.objects.create(openid=openid, user=user)

        # 4,返回
        return user
class UserInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("id","username","mobile","email","email_active")